Fork me on GitHub

Python 高级提升(二)

前言:

  1. 可变参数的装包与拆包;
  2. 属性和方法;
  3. 魔法属性、方法;
  4. property 属性;
  5. with 与 上下文管理。

一、可变参数的装包与拆包

1. 装包,针对的是形参中的 *args、**kwargs
通过'*'告诉 python 解析器 把调用者传递过来的没有变量接收的未命名参数,装在 args 这个元组中
通过'**'告诉 python 解析器 把调用者传递过来的命名参数,装在kwargs这个字典中

2. 拆包,针对的是函数体中的 *args、**kwargs
函数体里的 args 依然是那个元组,但是 *args 的含义就是把元组中的数据进行拆包,也就是把元组中的数据拆成单个数据
kwargs 同理可知

二、属性和方法

1. 类属性与实例属性
1. 类属性存放在类对象的内存中,在内存中只保存一份
2. 实例属性存放在实例对象的内存中,在每个实例对象中都单独保存一份
3. 如果每个实例对象需要具有相同值的属性,那么就定义类属性

2. 静态方法,类方法,实例方法
1. 方法定义:
@staticmethod
def static_fun():
"""静态方法"""

@classmethod
def class_fun(cls):
"""类方法"""

def instance_fun(self):
"""实例方法"""

2. 对比
相同点:对于所有的方法而言,均属于类,所以在内存中也只保存一份
不同点:方法调用者不同、调用方法时自动传入的参数不同。

三、魔法属性、方法

魔法属性和魔法方法是 Python 内置的一些属性和方法,代表着特殊意义,
命名时会在前后加两个下划线,在执行特定操作时,系统会自动调用它

1. __doc__
__doc__:表示类的描述信息

2. __module__,__class__
__module__:表示当前操作的对象或者类在哪个模块
__class__:表示当前操作的对象的类是什么

3. __dict__,__str__
__dict__:显示类或对象中的所有属性
__str__:如果类中重写了 __str__ 方法,那么在打印对象时,输出该方法的返回值

4. __init__,__del__
__init__:当类初始化对象时,自动执行该方法
__del__:当对象在内存中被销毁时,自动执行该方法

5. __call__
__call__:对象后面加 (),会自动执行该魔法方法
提示:必须在创建对象的类中添加 __call__() 方法,表示类的实例对象是能被 callable 调用的

四、property 属性

1. property 属性初体验
一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法,property 属性本质还是方法

property 属性的定义和调用注意点:
1. 定义时,在实例方法的基础上添加 @property 装饰器;并且方法仅有一个 self 参数
2. 调用时,无需括号

2. property 属性的好处
将一个属性的操作方法封装为一个属性,用户用起来就和操作普通属性完全一致,非常简单

3. 通过装饰器的方式定义 property 属性
1. 使用装饰器方式定义 property 属性
- @property
取得属性值,修饰的方法有且仅有一个 self 参数
- @方法名.setter
设置属性值,修饰的方法,只能传一个参数
- @方法名.deleter
删除属性,修饰的方法有且仅有一个 self 参数

2. 访问 property 属性的三种方式
temp = obj.price # 获取 property 属性
obj.price = new_price # 修改 property 属性
del obj.price # 删除 property 属性(很少使用)

4. 通过类属性方式定义 property 属性
price = property(get_price, set_price, del_price, "描述信息")
第一个参数是方法名: 获取属性值
第二个参数是方法名: 设置属性值
第三个参数是方法名: 删除属性
第四个参数是字符串: 该属性的描述信息,通过类名.属性名.__doc__调用

obj.price # 获取 property 属性值
obj.price = new_price # 设置 property 属性值
obj.del_price() # 删除 property 属性(很少使用)
Obj.price.__doc__调用 # 通过类名.属性名.__doc__调用

五、with 与 上下文管理

1. with 使用:
with open("/home/python/Desktop/hello.txt", 'w') as file:
file.write('hello with')

2. 上下文管理器
上下文:context,也称为上下文环境,好比教室环境
上文
正文:讲课,主业务
下文

上下文管理:
任何实现了 __enter__() 和 __exit__() 方法的对象
都可称之为上下文管理器,上下文管理器可以使用 with 简化操作
__enter__():初始化资源对象,且返回资源对象
__exit__():业务执行完后,在该方法做善后、清理方面的工作

3. 装饰器的方式
import contextlib

@contextlib.contextmanager
def my_open(path, mode):
f = open(path, mode)
yield f
f.close()

小结: with 语法用于简化资源操作的后续清除操作,是 try/finally 的替代方法,实现原理建立在上下文管理器之上
-------------本文结束感谢您的阅读-------------

本文标题:Python 高级提升(二)

文章作者:曹永林

发布时间:2018年07月22日 - 09:07

最后更新:2018年07月28日 - 10:07

原始链接:http://jovelin.cn/2018/07/22/Python 高级提升(二)/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。